#region Usings

using System;
using System.IO;
using NUnit.Framework;
using Karma.Framework.Core.Domain.Tools.Import.Layout;
using Karma.Framework.Core.Domain.Tools.Import.Validation;
using Karma.Framework.Core.Test.Domain.Tools.Importador.Entidades;

#endregion

namespace Karma.Framework.Core.Test.Domain.Tools.Importador
{
    [TestFixture]
    public class ValidadorLayoutFixture
    {
        [Test]
        public void ValidaLayoutEntidadConAsociadosConIdRefTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + ".xlsx",
                                                                FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsFalse(resultado.HasErrors);
            Assert.IsNull(resultado.ErrorSummary);
        }

        [Test]
        public void ValidaLayoutEntidadConAsociadosErrorFormatoAsociadoVacioTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + "ErrorFormatoAsociadoVacio.xlsx",
                                                                FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsTrue(resultado.HasErrors);
            Assert.IsNotNull(resultado.ErrorSummary);

            var summary = resultado.ErrorSummary;
            Assert.IsNotNull(summary.Errors);
            Assert.AreEqual(2, summary.Errors.Count);

            var error1 = summary.Errors[0];
            Assert.AreEqual(5, error1.Column);
            Assert.AreEqual(4, error1.Line);
            Assert.AreEqual(ErrorType.Format, error1.Type);
            Assert.AreEqual("La columna Entidad no acepta valores vacios.", error1.Description);

            var error2 = summary.Errors[1];
            Assert.AreEqual(5, error2.Column);
            Assert.AreEqual(5, error2.Line);
            Assert.AreEqual(ErrorType.Format, error2.Type);
            Assert.AreEqual("La columna Entidad no acepta valores vacios.", error2.Description);
        }

        [Test]
        public void ValidaLayoutEntidadConAsociadosTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + ".xlsx",
                                                                FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsFalse(resultado.HasErrors);
            Assert.IsNull(resultado.ErrorSummary);
        }

        [Test]
        public void ValidaLayoutEntidadSimpleErrorFormatoCeldasVaciasTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + "ErrorFormatoCeldasVacias.xlsx",
                                                                FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsTrue(resultado.HasErrors);
            Assert.IsNotNull(resultado.ErrorSummary);

            var summary = resultado.ErrorSummary;
            Assert.IsNotNull(summary.Errors);
            Assert.AreEqual(3, summary.Errors.Count);

            var error1 = summary.Errors[0];
            Assert.AreEqual(2, error1.Column);
            Assert.AreEqual(2, error1.Line);
            Assert.AreEqual(ErrorType.Format, error1.Type);
            Assert.AreEqual("La columna Cadena no acepta valores vacios.", error1.Description);

            var error2 = summary.Errors[1];
            Assert.AreEqual(2, error2.Column);
            Assert.AreEqual(4, error2.Line);
            Assert.AreEqual(ErrorType.Format, error2.Type);
            Assert.AreEqual("La columna Cadena no acepta valores vacios.", error2.Description);

            var error3 = summary.Errors[2];
            Assert.AreEqual(2, error3.Column);
            Assert.AreEqual(6, error3.Line);
            Assert.AreEqual(ErrorType.Format, error3.Type);
            Assert.AreEqual("La columna Cadena no acepta valores vacios.", error3.Description);
        }

        [Test]
        public void ValidaLayoutEntidadSimpleErrorFormatoColumnaTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + "ErrorFormatoColumna.xlsx",
                                                                FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsTrue(resultado.HasErrors);
            Assert.IsNotNull(resultado.ErrorSummary);

            var summary = resultado.ErrorSummary;
            Assert.IsNotNull(summary.Errors);
            Assert.AreEqual(2, summary.Errors.Count);

            var error = summary.Errors[0];
            Assert.AreEqual(3, error.Column);
            Assert.AreEqual(1, error.Line);
            Assert.AreEqual(ErrorType.Format, error.Type);
            Assert.IsTrue(error.Description.StartsWith("Columna incorrecta "));

            var error2 = summary.Errors[0];
            Assert.AreEqual(3, error2.Column);
            Assert.AreEqual(1, error2.Line);
            Assert.AreEqual(ErrorType.Format, error2.Type);
            Assert.IsTrue(error2.Description.StartsWith("Columna incorrecta "));
        }

        [Test]
        public void ValidaLayoutEntidadSimpleTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsFalse(resultado.HasErrors);
            Assert.IsNull(resultado.ErrorSummary);
        }

        [Test]
        public void ValidaLayoutEntidadYUnAgregadoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutValidator();
            var resultado = archivoBuilder.Validate(layout, new FileStream(
                                                                "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                                layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));

            Assert.IsNotNull(resultado);
            Assert.IsFalse(resultado.HasErrors);
            Assert.IsNull(resultado.ErrorSummary);
        }
    }
}